/**
 * 处理异步
 * 1. Promise
 * 2. async - await
 * 
 * 区别：
 * 1. Promise更倾向于解决含有复杂逻辑代码的异步问题，.then()方法内部可以写异步操作，可以链式调用；
 * 2. async - await更适合处理简单逻辑代码的异步问题，可以直接返回结果。适合接口属性调用，会有智能提示。
 * 
 * 知识点：
 * 1. Promise的状态：pending、fulfilled、rejected；
 * 2. Promise的then()方法接收两个参数，分别是resolve和reject，分别代表成功和失败的回调函数；.then()写两个参数或.then - .catch
 * 3. async - await的使用，需要在函数前面加上async关键字，然后在内部使用await关键字，await后面可以跟Promise对象，等到Promise对象状态改变后，才会继续执行后面的代码；
 * 
 * 注意：如果有 reject 参数，需要捕获，否则报错
 * 1. Promise 需要 .catch() 捕获异常，即 reject 参数
 * 2. async - await 需要 try - catch 捕获异常
 */

// 原理
function fun(){
  return '王二狗'
}

let fn = fun()
// console.log(fn);

// 含有异步的函数里面不能用return（如下案例的setTimeout里的return会是undefined）
// function fun1(){
//   const p1 = new Promise((resolve)=>{
//     setTimeout(()=>{
//       resolve('猪八戒')
//     },1000)
//   })
//   return p1
// }

// 简写
function fun1(){ 
  return new Promise((resolve)=>{
    setTimeout(()=>{
      resolve('猪八戒')
    },1000)
  })
}

function fun2(){ 
  return new Promise((resolve)=>{
    setTimeout(()=>{
      resolve('孙悟空')
    },1000)
  })
}

// 1.Promise
fun1().then((res)=>{
  console.log(res);
  return fun2()
}).then((res)=>{
  console.log(res);
})                   // 输出：猪八戒、孙悟空

// 2.await
// 2.1 await(在外部使用)
let f1 = await funasy()

// 2.2 await(在内部使用加上async)
//写法一：
async function funasy() {
  let fn1 = await fun1()
  console.log(fn1)
  let fn2 = await fun2()
  console.log(fn2)
}

funasy()

//写法二：
let funasy2 = async ()=>{
  let fn1 = await fun1()
  console.log(fn1)
  let fn2 = await fun2()
  console.log(fn2)
}
funasy2()

// 2.3 try - catch 捕获异常
async function funasy3() {
  try {
    let fn1 = await fun1()
    console.log(fn1)
    let fn2 = await fun2()
    console.log(fn2)
  } catch (error) {
    console.log(error);
  }
}

funasy3()

// 3. Promise 的 then()方法接收两个参数，resolve - reject
function fun3(){ 
  return new Promise((resolve,reject)=>{
    setTimeout(()=>{

      let flag = true
      if(flag){
        resolve('沙和尚')
      }else{
        reject('唐僧')
      }

    },1000)
  })
}

// 写法一：
fun3().then((res)=>{
  console.log(res);
},(res)=>{
  console.log(res);
})

// 写法二：.then() - .catch()
fun3().then((res)=>{
  console.log(res);
}).catch((res)=>{
  console.log(res);
})

export { }
